前言

我之前也没怎么用过github联合多人写项目,对git的操作也是一知半解,但是总是逃不掉的,最近为了填我4个多月前立下的flag,我不得不学习一下git 的操作,并完成项目的 PR,下面就是我的一些记录。

git 基本概念

git 本地有三个重要的区域,我们平时都是在这四个区域中进行操作的

(1)工作区

(2)暂存区

(3)本地仓库(从 github 上 clone 下来的仓库)

(4)远程仓库(github 的仓库)

认识主人

有了git以后可以让他认识自己的主人

git config --global user.name ""
git config --global user.email ""

可以查看是否添加成功了自己的用户名和邮箱(要对应自己要操纵的github账号)

git config --list 

创建自己的本地仓库

先进入自己要创建仓库的目录

cd xxx

初始化自己的本地仓库

git init 

写一个 README.md

git add README.md
git commit -m "add a readme.md"

查看当前项目的状态信息

git status

恢复上一次提交

git reset HEAD (<filename>/~+n/ID)

(解释一下这个波浪线,一个波浪线代表退回到上一个版本,~+n 代表退回到上n个版本)

将暂存区的文件覆盖本地工作区目录文件(慎用)

git checkout <filename>

查看提交到本地仓库的历史

git log

回退功能详解

我们知道我们有三个工作区:工作区、暂存区、本地仓库

那么版本信息在这三个区域中都是以线性的方式保存的

1.第一种情况:

当我们将数据提交到本地仓库以后再执行

git reset [--mixed ] HEAD~

实际上影响了两个区域(暂存区和本地仓库),他们的head 指针都会指向上一个版本(注意,快照也就是版本信息并没有丢失,只是指针没有指向那里而已,类似于数据结构),而本地工作区不受影响,于是我们这时候再使用

git log 

命令查看本地仓库就只有之前的几个版本信息了,使用

git status

会提示我们说新的版本没有提交到暂存区,这也就是说明了我们本地工作区版本没有回退,但是暂存区和本地仓库都回退了

2.第二种情况:
执行

git reset --soft HEAD~ 

这条命令只会将本地仓库的版本回退而不会同时回退暂存区的版本(简单的说就是撤销上一次的commit)

3.第三种情况:
执行

git reset --hard HEAD~

这个命令就是会将三个区域的版本全部回退(慎用)

注意:

1.reset 可以指定快照中的个别文件进行回滚

git reset 版本快照  文件名/路径

2.reset 不仅能往回滚还能往前滚

git reset 版本 ID 

3.如果找不到之前的版本了怎么办
别急,下面这条命令能帮助我们

git reflog

git 的比较功能

1.比较暂存区和本地工作目录仓库

git diff

(1)我们看到的 a/ b/ 意思是git 将 暂存区和本地工作区的文件拷贝到了两个虚拟的目录下再进行比较

(2)— 代表旧文件 +++ 代表新文件

(3)@@ @@ 之间的 -1,20 代表旧文件从第一行到第20行 +1,20 代表新文件从第一行到第20行,这下面是两个文件合并显示的结果

(4)\no newline at the end of file 这句话表示文件末尾本身没有换行符,但是 Git为了显示的方便自己加了一个换行符

2.比较历史的两个版本

git diff 版本ID1 版本ID2

3.比较本地工作区和本地仓库的快照

git diff 版本ID

如果想和最新的快照版本比较,我们可以不写版本ID

git diff HEAD

4.比较暂存区和本地仓库的快照

git diff --cached [版本ID]

实用小技巧

1.修改最后一次的提交

如果已经将修改提交到了本地仓库,但是发现自己有些东西又要更新了,但是又不想在本地仓库创建一个新的版本,这时候就需要用到修改功能了

git commit --amend

执行完以后,暂存区的更新就能和本地仓库同步了

2.恢复本地删除的文件

git checkout -- <filename>

3.删除错误提交到远程仓库的文件

下面这条命令就会把本地工作区和暂存区的指定的文件删除

git rm <filename>

但是现在本地仓库还存在着我们错误提交的文件,那这个时候我们就需要使用上面介绍的 reset –soft HEAD~ 命令了

注意:扩展介绍一下 git rm 这个命令

1.如果我们使用这条命令的时候本地工作区和暂存区不一致,那么会报出提示,如果你使用 -f 选项将会强制将这个文件删除

git rm -f <filename>

2.如果我们只想删除暂存区的文件而想保留本地工作区的文件的话,我们可以使用 –cached

git rm --cached <filename>

4.重命名

git rm 旧文件名  新文件名

git 创建分支

git branch <name>

查看当前的分支的情况

git log --decorate --oneline

–decorate 这个参数会显示 HEAD 指向的分支
–oneline 这个参数会简略显示关键信息

git 切换分支

git checkout <name>

注意:

1.git log 只能显示当前的分支的保存的快照
2.你在当前分支所做修改以后,如果切换到了另一个分支的话,那么你就会发现,所做的修改都消失了
3.以图形化形式显示分支的当前状态

git log --decorate --oneline --graph --all

git 合并分支

1.单纯地合并本地的分支

git merge <name>

但是这种情况一把不会一下子成功,一般都会产生冲突,这种冲突我们需要自己解决

我们查看一下当前的状态, 这个会显示哪些文件产生了冲突,需要我们手动修改的

git status

找到对应的文件以后我们就能直接取文件夹中打开这个文件了,为了方便我们的查找,git已经在文件的里面为我们标记了所有冲突的位置,我们只需要将他自动添加的标记删除以后确认我们最终需要的部分保存就可以了

2.拉取远程和本地合并

git pull <远程主机名> <远程分支名>:<本地分支名>

比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样 -

git pull origin next:master

过程

git 删除分支

git branch -d <name>

将本地分支推送到远程仓库

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。

git push <远程主机名> <本地分支名>:<远程分支名>

比如:

git push origin K0rz3n-branch:master

PR 的基本流程

1.fork 对方的项目到自己的仓库

2.在本地找一个文件夹,使用 git clone 命令将fork下来放在自己远程仓库上的项目clone 到本地,成为本地仓库

3.进入该目录与原始项目建立连接

git remote add upstream 项目地址

git remote -v 查看

4.创建并 新的分支

git checkout -b 名称

5.在本地进行任意的修改

6.git add 、 git commit -m 、 git pull 、git push

7.github 上可以看到到我们新提交上来的分支了

8.我们直接 New pull request 、 Create pull request 处理好冲突,写上我们添加或者修改的摘要

总结:

git 作为一个分布式开源版本控制系统已经为世界广泛使用,掌握其基本的操作并能完成多人合作的项目已经是程序员必不可少的技能。

参考链接:

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

https://blog.csdn.net/vim_wj/article/details/78300239